package com.tourism.core.cn.utils;
/*********************************************************************
 Copyright(c) 2025 All Rights Reserved .
 Author : liliang
 CreatedOn : 2025/1/2 19:24
 Email : 2061996582@qq.com
 Describe : TODO
 UseCase :
 Version : 2025|V1.0.0.0
 **********************************************************************/

import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import lombok.Data;

import java.util.HashMap;
import java.util.Map;

/**
 * @author new
 * @date 2025/1/2 19:24
 */
public class JsonParseUtil {
    /**
     * 解析报文
     * @param jsonStr JSON字符串
     * @return 解析后的MessageWrapper对象
     */
    public static MessageWrapper parseMessage(String jsonStr) {
        return JSON.parseObject(jsonStr, MessageWrapper.class);
    }

    /**
     * 递归解析JSON对象，返回扁平化的key-value映射
     * @param jsonStr JSON字符串
     * @return 扁平化的key-value映射
     */
    public static Map<String, Object> parseToMap(String jsonStr) {
        MessageWrapper wrapper = parseMessage(jsonStr);
        Map<String, Object> result = new HashMap<>();
        result.put("flag", wrapper.getFlag());
        parseJsonObject(wrapper.getData(), "", result);
        return result;
    }

    /**
     * 递归解析JSONObject
     * @param jsonObject JSON对象
     * @param prefix key的前缀
     * @param result 结果Map
     */
    private static void parseJsonObject(JSONObject jsonObject, String prefix, Map<String, Object> result) {
        for (String key : jsonObject.keySet()) {
            Object value = jsonObject.get(key);
            String currentKey = prefix.isEmpty() ? key : prefix + "." + key;

            if (value instanceof JSONObject) {
                parseJsonObject((JSONObject) value, currentKey, result);
            } else if (value instanceof JSONArray) {
                parseJsonArray((JSONArray) value, currentKey, result);
            } else {
                result.put(currentKey, value);
            }
        }
    }

    /**
     * 递归解析JSONArray
     * @param jsonArray JSON数组
     * @param prefix key的前缀
     * @param result 结果Map
     */
    private static void parseJsonArray(JSONArray jsonArray, String prefix, Map<String, Object> result) {
        for (int i = 0; i < jsonArray.size(); i++) {
            Object value = jsonArray.get(i);
            String currentKey = prefix + "[" + i + "]";

            if (value instanceof JSONObject) {
                parseJsonObject((JSONObject) value, currentKey, result);
            } else if (value instanceof JSONArray) {
                parseJsonArray((JSONArray) value, currentKey, result);
            } else {
                result.put(currentKey, value);
            }
        }
    }

    /**
     * 报文包装类
     */
    @Data
    public static class MessageWrapper {
        private String flag;           // 操作标识
        private JSONObject data;       // 数据部分
    }
}
